package ar.uba.fi.tecnicas.vista;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

import ar.uba.fi.tecnicas.fabrica.LineaProduccion;
import ar.uba.fi.tecnicas.fabrica.Maquina;
import ar.uba.fi.tecnicas.fabrica.MateriaPrima;
import ar.uba.fi.tecnicas.fabrica.TipoProducto;
import ar.uba.fi.tecnicas.fabrica.Transformacion;
import ar.uba.fi.tecnicas.juego.Juego;

public class PanelInformacion extends JPanel implements ActionListener
{
	protected static final long serialVersionUID = 0;
	
	private JLabel lblNombre;
	private JLabel lblCapital;
	private JLabel lblHora;	
	private JLabel lblPorcentajeInvestigacion;
	private JLabel lblCapitalInvertido;
	private JButton btnProductosConocidos;
	private JButton btnLineasProduccion;
	
	public PanelInformacion()
	{		
		this.inicializarComponentes();
		
		this.agregarComponentes();
		
		this.setLayout(new GridLayout(2, 2));
	}
	
	private void inicializarComponentes()
	{		
		this.lblNombre = new JLabel("Jugador: " + Juego.instancia.getJugador().getNombre());		
		this.lblCapital = new JLabel("");		
		this.lblHora = new JLabel("");		
		this.lblPorcentajeInvestigacion = new JLabel("");
		this.lblCapitalInvertido = new JLabel("");
		this.btnProductosConocidos = new JButton("Productos Conocidos");
		this.btnProductosConocidos.addActionListener(this);
		this.btnLineasProduccion = new JButton("Lineas de Produccion");
		this.btnLineasProduccion.addActionListener(this);
		
		this.refrescarInformacion();
	}
	
	private void agregarComponentes()
	{
		this.add(this.lblNombre);
		this.add(this.lblCapital);
		this.add(this.lblHora);
		this.add(this.lblPorcentajeInvestigacion);
		this.add(this.lblCapitalInvertido);
		this.add(this.btnProductosConocidos);
		this.add(this.btnLineasProduccion);
	}

	public void refrescarInformacion() 
	{
		String capital = String.valueOf(Juego.instancia.getJugador().getCapital());
		
		this.lblCapital.setText("Dinero: $" + capital);
		this.lblHora.setText("Fecha y hora: " + Juego.instancia.getHoraDelDia());

		String porcentajeInvestigacion = "Porcentaje Investigacion: ";
		porcentajeInvestigacion += Juego.instancia.getJugador().getPorcentajeInvestigacion();
			
		this.lblPorcentajeInvestigacion.setText(porcentajeInvestigacion);
		
		String capitalInvertido = "Capital Invertido Lab.: ";
		capitalInvertido += Juego.instancia.getJugador().getCapitalInvertido();
		this.lblCapitalInvertido.setText(capitalInvertido);		
	}
	
	public void actionPerformed(ActionEvent e)
	{ 
		if(e.getSource().equals(this.btnProductosConocidos))
		{
			this.mostrarTiposProductosConocidos();
		}
		
		if(e.getSource().equals(this.btnLineasProduccion))
		{
			this.mostrarLineasProduccion();
		}
	}
	
	private void mostrarLineasProduccion() 
	{
		String informacion = "";
		
		for(LineaProduccion linea : Juego.instancia.getJugador().getLineasProduccion())
		{
			informacion += linea.getNombre() + ": ";

			if(linea.detenida())
			{
				informacion += "Detenida";
			}
			else
			{
				informacion += "Activa";
			}
			
			informacion += " - ";
			
			if(linea.getPrimerItem() != null)
			{
				Maquina primera = (Maquina)linea.getPrimerItem();
				informacion += "Primer Item (" + primera.getTipo().getNombre() + ")";
			}
			else
			{
				informacion += "Primer Item (Ninguno)";
			}
			
			informacion += "\n - Materias Primas Necesarias: ";
			String materiasPrimas = "";
			
			for(MateriaPrima materiaPrima : linea.getMateriaPrimaNecesaria())
			{
				if(materiasPrimas != "")
				{
					materiasPrimas += ", ";
				}
				materiasPrimas += materiaPrima.getTipo().getNombre();
				materiasPrimas += "(" + materiaPrima.getCantidad() + " " + materiaPrima.getTipo().getUnidad() + ")"; 
			}
			
			informacion += materiasPrimas;

			informacion += "\n";
		}
		
		JOptionPane.showMessageDialog(null, informacion);
	}

	private void mostrarTiposProductosConocidos()
	{
		String informacion = "";
		
		for(TipoProducto tipo : Juego.instancia.getJugador().getTiposProductoConocidos())
		{
			if(informacion != "")
			{
				informacion += "\n";
			}

			informacion += tipo.getNombre();
			informacion += "\n- Transformaciones: ";
			String transformaciones = "";
			
			for(Transformacion transformacion: tipo.getTransformaciones())
			{
				if(transformaciones != "")
				{
					transformaciones += ", ";
				}

				transformaciones += transformacion.getNombre(); 
			}

			informacion += transformaciones;
			
			informacion += "\n- Materia Prima: ";
			String materiasPrimas = "";
			
			for(MateriaPrima materiaPrima: tipo.getMateriasPrimas())
			{
				if(materiasPrimas != "")
				{
					materiasPrimas += ", ";
				}
				materiasPrimas += materiaPrima.getTipo().getNombre();
				materiasPrimas += "(" + materiaPrima.getCantidad() + " " + materiaPrima.getTipo().getUnidad() + ")"; 
			}
			informacion += materiasPrimas;
		}
		
		JOptionPane.showMessageDialog(null, informacion);
	}
}
